]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
allow dehydrating pinned LNK files
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 16 Dec 2024 13:02:02 +0000 (14:02 +0100)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 16 Dec 2024 15:15:40 +0000 (16:15 +0100)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/vfs/cfapi/cfapiwrapper.cpp
test/testsynccfapi.cpp

index c1d13479f69e5deea4853d71ed6a860ccdb8a3a8..99100dde584baef408d8f03df18d61bff92b3a42 100644 (file)
@@ -334,6 +334,8 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderStat
         OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.ChangeTime);
         metadata.BasicInfo.FileAttributes = 0;
 
+        OCC::CfApiWrapper::setPinState(path, OCC::PinState::Unspecified, OCC::CfApiWrapper::SetPinRecurseMode::NoRecurse);
+
         qCInfo(lcCfApiWrapper) << "updatePlaceholderState" << path << modtime;
         const qint64 result = CfUpdatePlaceholder(OCC::CfApiWrapper::handleForPath(path).get(), updateType == CfApiUpdateMetadataType::AllMetadata ? &metadata : nullptr,
                                                   fileIdentity.data(), sizeToDWORD(fileIdentitySize),
@@ -345,7 +347,7 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderStat
             return errorMessage;
         }
 
-               // Pin state tends to be lost on updates, so restore it every time
+        // Pin state tends to be lost on updates, so restore it every time
         if (!setPinState(path, previousPinState, OCC::CfApiWrapper::NoRecurse)) {
             return { "Couldn't restore pin state" };
         }
@@ -906,16 +908,21 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::de
 
     const auto info = findPlaceholderInfo(path);
     if (info) {
-        LARGE_INTEGER largeStart, largeSize;
-        largeStart.QuadPart = 0;
-        largeSize.QuadPart = size;
-
-        const qint64 result = CfDehydratePlaceholder(handleForPath(path).get(),
-                                                     largeStart,
-                                                     largeSize,
-                                                     CF_DEHYDRATE_FLAG_NONE,
-                                                     0);
-
+        setPinState(path, OCC::PinState::OnlineOnly, OCC::CfApiWrapper::NoRecurse);
+
+        CF_FILE_RANGE dehydrationRange;
+        dehydrationRange.StartingOffset.QuadPart = 0;
+        dehydrationRange.Length.QuadPart = size;
+
+        const qint64 result = CfUpdatePlaceholder(handleForPath(path).get(),
+                                                  nullptr,
+                                                  fileIdentity.data(),
+                                                  sizeToDWORD(fileIdentitySize),
+                                                  &dehydrationRange,
+                                                  1,
+                                                  CF_UPDATE_FLAG_MARK_IN_SYNC | CF_UPDATE_FLAG_DEHYDRATE,
+                                                  nullptr,
+                                                  nullptr);
         if (result != S_OK) {
             const auto errorMessage = createErrorMessageForPlaceholderUpdateAndCreate(path, "Couldn't update placeholder info");
             qCWarning(lcCfApiWrapper) << errorMessage << path << ":" << QString::fromWCharArray(_com_error(result).ErrorMessage());
index a306bc44e2b25d8903131ba25c1f6dfd35e143c2..d1ef2994e2866b71310889c5ac4760970355a435 100644 (file)
@@ -1210,7 +1210,7 @@ private slots:
         CFVERIFY_VIRTUAL(fakeFolder, "local/file1");
 
         QCOMPARE(*vfs->pinState("online/file1"), PinState::Unspecified);
-        QCOMPARE(*vfs->pinState("local/file1"), PinState::Unspecified);
+        QCOMPARE(*vfs->pinState("local/file1"), PinState::OnlineOnly);
 
         // no change on another sync
         QVERIFY(fakeFolder.syncOnce());